import pygame
from random import *


# 定义小型敌机类，继承动画精灵
class smallenemy(pygame.sprite.Sprite):
    def __init__(self, bg_size):
        pygame.sprite.Sprite.__init__(self)
        # 载入小型敌机图片
        self.image = pygame.image.load("images/enemy1.png").convert_alpha()
        # 载入小型敌机坠机图片
        self.destroy_images = []
        self.destroy_images.extend([
            pygame.image.load("images/enemy1_down1.png").convert_alpha(),
            pygame.image.load("images/enemy1_down2.png").convert_alpha(),
            pygame.image.load("images/enemy1_down3.png").convert_alpha(),
            pygame.image.load("images/enemy1_down4.png").convert_alpha()
        ])
        # 获得敌机的矩形位置
        self.rect = self.image.get_rect()
        # 获得小型敌机的活动范围
        self.width, self.height = bg_size[0], bg_size[1]
        # 设置小型敌机的飞行速度
        self.speed = 2
        # 设置飞机的生存状态
        self.active = True
        # 设置敌机是否被击中
        self.hit = False
        # 设置小型敌机在窗口的5倍之内的距离出现
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-5 * self.height, 0)
        # 给敌机添加mask属性，将图片的非透明部分标记为mask，用于检测碰撞
        self.mask = pygame.mask.from_surface(self.image)

    # 小型敌机的移动函数
    def move(self):
        # 如果小型敌机的顶部没有超过窗口的下边界
        if self.rect.top < self.height:
            # 小型敌机向下飞speed像素
            self.rect.top += self.speed
        # 如果小型敌机超过下边界，重置小型敌机
        else:
            self.reset()

    # 重置小型敌机函数
    def reset(self):
        self.active = True
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-5 * self.height, 0)


# 定义中型敌机类，继承动画精灵
class midenemy(pygame.sprite.Sprite):
    # 中型敌机的生命值，
    energy = 8

    def __init__(self, bg_size):
        pygame.sprite.Sprite.__init__(self)
        # 载入中型敌机图片
        self.image = pygame.image.load("images/enemy2.png").convert_alpha()
        self.image_hit = pygame.image.load("images/enemy2_hit.png").convert_alpha()
        # 载入中型敌机坠机图片
        self.destroy_images = []
        self.destroy_images.extend([
            pygame.image.load("images/enemy2_down1.png").convert_alpha(),
            pygame.image.load("images/enemy2_down2.png").convert_alpha(),
            pygame.image.load("images/enemy2_down3.png").convert_alpha(),
            pygame.image.load("images/enemy2_down4.png").convert_alpha()
        ])
        # 敌机的矩形位置
        self.rect = self.image.get_rect()
        # 中型敌机的活动范围
        self.width, self.height = bg_size[0], bg_size[1]
        # 中型敌机的飞行速度
        self.speed = 1
        # 飞机的生存状态
        self.active = True
        # 中型敌机在窗口的1倍到10倍之间的距离出现
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-10 * self.height, -self.height)
        # 给敌机添加mask属性，将图片的非透明部分标记为mask，用于检测碰撞
        self.mask = pygame.mask.from_surface(self.image)
        # 赋值给对象属性
        self.energy = midenemy.energy
        # 敌机是否被击中
        self.hit = False

    # 中型敌机的移动函数
    def move(self):
        # 如果中型敌机的顶部没有超过窗口的下边界
        if self.rect.top < self.height:
            # 中型敌机向下飞speed像素
            self.rect.top += self.speed
        # 如果中型敌机超过下边界，重置中型敌机
        else:
            self.reset()

    # 重置中型敌机函数
    def reset(self):
        self.active = True
        self.energy = midenemy.energy
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-10 * self.height, -self.height)


# 定义大型敌机类，继承动画精灵
class bigenemy(pygame.sprite.Sprite):
    # 大型敌机的生命值
    energy = 20

    def __init__(self, bg_size):
        pygame.sprite.Sprite.__init__(self)
        # 载入大型敌机图片
        self.image1 = pygame.image.load("images/enemy3_n1.png").convert_alpha()
        self.image2 = pygame.image.load("images/enemy3_n2.png").convert_alpha()
        self.image_hit = pygame.image.load("images/enemy3_hit.png").convert_alpha()
        # 载入大型敌机坠机图片
        self.destroy_images = []
        self.destroy_images.extend([
            pygame.image.load("images/enemy3_down1.png").convert_alpha(),
            pygame.image.load("images/enemy3_down2.png").convert_alpha(),
            pygame.image.load("images/enemy3_down3.png").convert_alpha(),
            pygame.image.load("images/enemy3_down4.png").convert_alpha(),
            pygame.image.load("images/enemy3_down5.png").convert_alpha(),
            pygame.image.load("images/enemy3_down6.png").convert_alpha()
        ])
        # 获得敌机的矩形位置
        self.rect = self.image1.get_rect()
        # 获得大型敌机的活动范围
        self.width, self.height = bg_size[0], bg_size[1]
        # 设置大型敌机的飞行速度
        self.speed = 1
        # 设置敌机生存状态
        self.active = True
        # 设置大型敌机在窗口的5倍到15倍之间的距离出现
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-15 * self.height, -5 * self.height)
        # 给敌机添加mask属性，将图片的非透明部分标记为mask，用于检测碰撞
        self.mask = pygame.mask.from_surface(self.image1)
        # 赋值给对象属性
        self.energy = bigenemy.energy
        # 敌机是否被击中
        self.hit = False

    # 大型敌机的移动函数
    def move(self):
        # 如果大型敌机的顶部没有超过窗口的下边界
        if self.rect.top < self.height:
            # 大型敌机向下飞speed像素
            self.rect.top += self.speed
        # 如果大型敌机超过下边界，重置大型敌机
        else:
            self.reset()

    # 重置大型敌机函数
    def reset(self):
        self.active = True
        self.energy = bigenemy.energy
        self.rect.left, self.rect.top = \
            randint(0, self.width - self.rect.width), \
            randint(-15 * self.height, -5 * self.height)
